package com.cskaoyan.javase.object.wrapper;

/**
 * 包装类型和对应基本数据类型具有"自动拆箱和装箱"
 * 拆箱: 把包装类的引用数据类型类型变量，转换为其对应基本数据类型变量，称之为"拆箱"
 * 装箱: 把基本数据类型变量，转换为其对应包装类的引用数据类型变量，称之为"装箱"
 * 装箱和拆箱都是自动完成的,这意味着:
 * 在绝大多数情况下,包装类型和对应基本数据类型变量,完全可以混合使用,是同一回事
 *
 * 自动装箱和拆箱其实是一种语法糖,在底层自动调用了方法而已:
 *      装箱依赖于,包装类型类名.valueOf
 *      拆箱依赖于,包装类型对象名.基本数据类型名Value();
 *
 * 当然包装类型和对应基本数据类型也有部分场景是不能混用的
 * 典型的就是集合容器当中
 * 注意集合容器中只能存放对象(引用)
 * 不能存放基本数据类型元素
 *
 * @since 10:22
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo3 {
    public static void main(String[] args) {
        Integer a = 123;
        int b = a;

        // Unnecessary boxing 'Integer.valueOf(123)'
        Integer i = Integer.valueOf(123);
        // Unnecessary unboxing 'i.intValue()'
        int i2 = i.intValue();

        Double d = Double.valueOf(0.1);
        double d2 = d.doubleValue();

        System.out.println("----------------------");

        int[] arr = {12, 2, 34, 23, 423, 4, 32, 4, 23};
        // arr = null;
        arr = new int[0];
        System.out.println(getMaxByIntArr(arr));
    }

    // 需求: 求一个int类型数组的最大值
    /*
        如果方法传入的不是一个正常数组怎么办?
            比如长度为0的数组
            比如null数组
        需要用if判断,排除这些不正常情况
     */
    public static Integer getMaxByIntArr(int[] arr) {
        if (arr == null || arr.length == 0) {
            System.out.println("数组不是正常的,没有最大值!");
            // return -1;
            /*
                这里返回任何一个值都不合适,在实际开发中有两种常见的解决办法:
                    1.用包装类型做返回值,利用自动拆装箱,不影响正常的方法返回值
                        在不正常情况下返回null
                    2.抛出异常,可以完成类似于return的作用.(这个更常用)
             */
            return null;
        }
        int max = arr[0];
        for (int ele : arr) {
            if (ele > max) {
                max = ele;
            }
        }
        return max;
    }
}
